package com.example.demo.algorithm.sort.choice;

public class ChoiceSort<E> {
    private ChoiceSort() {
    }

    ;

    /*从前往后找*/
    public static <T extends Comparable<T>> void serach(T[] dat) {
        /*选择 dat[i...n)  前闭后开 找出最新的索引值，排序里面要有一个变量index来代表最小值才能实现排序 ---选择排序  */
        for (int i = 0; i < dat.length; i++) {
            //每次循环的值  存储变量
            int index = i;
            //循环找出每轮循环的最小值   从i 到 n 开始
            for (int j = i; j < dat.length; j++) {
                /*拿到二个值比较，比较最小值*/
                //泛型要做约束才能进行固定的类型比较 ，需要在改方法上面实现<T extends Comparable<T>>,然后不能用<> 要用compareTo
                if (dat[j].compareTo(dat[index]) < 0) {
                    /*更新原来的变量值为最小值*/
                    index = j;
                }
            }
            /*替换该数组中的值排序*/
            sawp(dat, i, index);
        }
    }

    /*从后往前找*/
    public static <T extends Comparable<T>> void serach2(T[] dat) {
        /*选择 dat[n...i)  前闭后开 找出最新的索引值，排序里面要有一个变量index来代表最小值才能实现排序 ---选择排序  */
        for (int i = dat.length - 1; i >= 0; i--) {
            //每次循环的值  存储变量
            int index = i;
            //循环找出每轮循环的最小值   从n 到 i 开始
            for (int j = i; j >= 0; j--) {
                /*拿到二个值比较，比较最小值*/
                //泛型要做约束才能进行固定的类型比较 ，需要在改方法上面实现<T extends Comparable<T>>,然后不能用<> 要用compareTo
                if (dat[j].compareTo(dat[index]) > 0) {
                    /*更新原来的变量值为最小值*/
                    index = j;
                }
            }
            /*替换该数组中的值排序*/
            sawp(dat, i, index);
        }
    }

    private static <T> void sawp(T[] dat, int i, int index) {
        /*默认排序*/
        T a = dat[i];
        /*拿到当前的值和最小值进行覆盖*/
        dat[i] = dat[index];
        /*覆盖后，原来的index要进行替换成原理的dat[i]新变量*/
        dat[index] = a;
    }

    private static <T extends Comparable<T>> boolean bool(T[] data) {
        for (int i = 0; i < data.length; i++) {
            //判断从i 到 i-1 每轮循环期间是否是排序的值
            if (data[i - 1].compareTo(data[i]) > 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Integer[] dat = {5, 3, 4, 6, 9, 1};
        ChoiceSort.serach2(dat);
        for (Integer integer : dat) {
            System.out.println(integer);
        }
    }
}
